package com.qmmessage.sdk.common.util;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.List;

/**
 * @author qm
 */
public class QmJsonUtil {
    private static final Gson GSON = new Gson();

    /**
     * json to object
     * @param json json string
     * @param typeOfT type class
     * @return object
     * @param <T> object type
     */
    public static <T> T fromJson(String json, Class<T> typeOfT) {
        Type type = TypeToken.getParameterized(typeOfT).getType();
        return GSON.fromJson(json, type);
    }
    /**
     * json to list
     * @param json json string
     * @param typeOfE type class
     * @return object
     */
    public static <E> List<E> fromJsonList(String json, Class<E> typeOfE) {
        return GSON.fromJson(json, TypeToken.getParameterized(List.class, typeOfE).getType());
    }

    /**
     * json to object
     * @param json json string
     * @param type type class
     * @return object
     * @param <T> object type
     */
    public static <T> T fromJson(String json, Type type) {
        return GSON.fromJson(json, type);
    }

    /**
     * object to json string
     * @param obj object
     * @param typeOfT object type
     * @return json string
     * @param <T> object data
     */
    public static <T> String toJson(Object obj, Class<T> typeOfT) {
        Type type = TypeToken.getParameterized(typeOfT).getType();
        return GSON.toJson(obj, type);
    }
    /**
     * object to json string
     * @param obj object
     * @param type object type
     * @return json string
     */
    public static String toJson(Object obj, Type type) {
        return GSON.toJson(obj, type);
    }
    /**
     * Collection object to json string
     * @param obj object
     * @param typeOfE object type
     * @return json string
     */
    public static <E> String toJsonList(List<E> obj, Class<E> typeOfE) {
        return GSON.toJson(obj, TypeToken.getParameterized(List.class, typeOfE).getType());
    }
}
